package server;

import java.io.Serializable;
import java.util.ArrayList;


/** Classe che gestisce la Specie dell'utente.
 *
 */
public class Specie implements Serializable{
	
	private static final long serialVersionUID = 1L;
	private String nome;
	private enum tipologia {Erbivoro, Carnivoro};
	private tipologia tipo;
	private int i=0;
	private ArrayList<Dinosauro> dinosauro = new ArrayList<Dinosauro>();
	private int punteggio;
	private int	 eta;
	private String nomeutente;
	private String estinzione;

	/** Costruttore Specie, chiamata alla registrazione di Utente.
	 * Crea inoltre un dinosauro in una posizione random.
	 * Ogni specie e' associata ad un Utente.
	 * @param nome Nome della Specie
	 * @param nomeu Nome dell'utente che crea la Razza.
	 * @param tip Tipo della razza, erbivoro o carnivoro.
	 */
	public Specie(String nome, String nomeu, String tip){
		
		this.nome = nome;
		if(tip.equals("c"))
			tipo = tipologia.Carnivoro;
		else tipo = tipologia.Erbivoro;
		this.nomeutente = nomeu;
		this.punteggio = 0;
		this.eta = 1;
		this.estinzione = "n";
		this.inserisciDinosauro();
	}
	
	/** Costruttore di specie, chiamato per il salvataggio in classifica.
	 * @param nome Nome della Specie.
	 * @param nomeu Nome dell'utente che crea la Specie.
	 * @param punteggio Punteggio della Specie.
	 * @param eta Eta' della Specie.
	 */
	public Specie(String nome, String nomeu, int punteggio, int eta){
		
		this.nome = nome;
		this.nomeutente = nomeu;
		this.punteggio = punteggio;
		this.eta = eta;
		this.estinzione="s";
	}
	
	/** Metodo che restituisce il nome della Specie.
	 * @return Ritorna il nome della Specie.
	 */
	public String getNomeSpecie(){
		return this.nome;
	}
	
	/** Metodo che ritorna l'oggetto Dinosauro.
	 * Nel caso dovesse fallire, ritorna un null.
	 * @param id ID di riferimento del Dinosauro.
	 * @return Ritorna l'oggetto di tipo Dinosauro che ha come ID quello passato al metodo.
	 */
	public Dinosauro getDinosauro(String id) {
		int i = 0;
		boolean x = false;
		if(dinosauro.size() == 0)
			return null;
		do {
			if ( dinosauro.get(i).getIdDino().equals(id))
				x = true;
			else i++;
		} while( x != true && i < dinosauro.size());
		if ( x == true )
			return dinosauro.get(i);
		else 
			return null;
	}

	/** Metodo che ritorna una stringa contenente il nome dell'utente.
	 * @return Nome dell'utente.
	 */
	public String getUtente() {
		return nomeutente;
	}

	/** Metodo che ritorna una stringa contentente il tipo di dinosauro.
	 * @return Tipo di Dinosauro.
	 */
	public String getTipo(){	
		return String.valueOf(tipo);
	}
	
	/** Metodo che ritorna un intero contenente il punteggio della Specie.
	 * @return Punteggio della Specie.
	 */
	public int getPunteggio() {
		return punteggio;
	}

	/** Metodo che setta il punteggio della Specie.
	 * @param punteggio Punteggio della Specie.
	 */
	public void setPunteggio(int punteggio) {
		this.punteggio = this.punteggio+punteggio;
	}	
	
	/** Metodo che ritorna un intero contenente l'eta' della Specie.
	 * @return Eta' della Specie.
	 */
	public int getEta() {
		return eta;
	}

	/** Metodo che incrementa l'eta' della Specie.
	 * @return L'eta' della Specie.
	 */
	public int incrementaEta() {
		
		this.eta = eta+1;
		for ( int i = 0; i < dinosauro.size(); i++){
			dinosauro.get(i).incrementaVita();
		}
		return eta;
	}
	
	/** Inserisce, in base al tipo definito della specie, un nuovo Dinosauro nella lista
	 * ponendo il dinosauro appena creato nella cella trovata libera grazie al metodo
	 * getCellaLibera.
	 * 
	 */
	public void inserisciDinosauro(){
		int x, y;
		String dino;
		
		x = (int)(Math.round(Math.random()*(Mappa.SIZE_X - 1)));
		y = (int)(Math.round(Math.random()*(Mappa.SIZE_Y - 1)));
		dino = this.nomeutente;
		dino = dino+":"+i;
		i++;
		if(tipo == tipologia.Erbivoro)
			dinosauro.add(new Erbivoro(x, y, dino));
		else dinosauro.add(new Carnivoro(x, y, dino));	
	}
	
	/** Metodo che gestisce la creazione di un uovo ritornando un oggetto di tipo Dinosauro.
	 * @param x Numero della riga nella quale inserire l'uovo.
	 * @param y Numero della colonna nella quale inserire l'uovo.
	 * @return L'oggetto di tipo Dinosauro che e' stato creato.
	 */
	public Dinosauro inserisciUovo(int x, int y){
		String dino;
		
		dino = this.nomeutente;
		dino = dino+":"+i;
		i++;
		if(tipo == tipologia.Erbivoro)
			dinosauro.add(new Erbivoro(x, y, dino));
		else dinosauro.add(new Carnivoro(x, y, dino));
		return dinosauro.get(dinosauro.size()-1);
	}
	
	/** Metodo che uccide un Dinosauro, ritorna un Boolean.
	 * @param id ID del Dinosauro da uccidere.
	 * @return Boolean dove true e' l'esito positivo, false quello negativo.
	 */
	public boolean uccidiDinosauro(String id){
		int i = 0;
		boolean x = false;
		
		if(dinosauro.size() == 0)
			return x;
		do {
			if ( dinosauro.get(i).getIdDino().equals(id))
				x = true;
			i++;
		} while( x != true && i < dinosauro.size());
		if ( x == true ){
			dinosauro.remove(i-1);
			return x;
		}
		else{ 
			x = false;
			return x;
		}
	}
	
	/** Metodo che passa al metodo chiamante l'ArrayList dei dinosauri dell'utente.
	 * @return dinosauro Ritorna l'ArrayList contenente tutti i dinosauri dell'utente.
	 */
	public ArrayList<Dinosauro> getArrayDino(){
		
		return dinosauro;
	}
	
	/** Metodo che restituisce la stringa per determinare se la razza e' ancora in gioco
	 * o se si e' estinta.
	 * @return Stringa s=estinta e n=non estinta.
	 */
	public String getEstinta(){
		return estinzione;
	}
}
